#include <stdio.h>
#include <windows.h>

int parity_check(const unsigned char *msg, const int msg_length) {
    // 检查输入参数有效性
    if (msg == NULL || msg_length <= 0) {
        return 0; // 无效输入，校验失败
    }

    // 计算所有位的奇偶性（偶校验）
    int parity_count = 0;

    for (int i = 0; i < msg_length; i++) {
        if (msg[i] != 0) { // 非0表示1
            parity_count++;
        }
    }

    // 偶校验：1的个数应为偶数
    // 如果1的个数是偶数，则校验通过；奇数则校验失败
    if (parity_count % 2 == 0) {
        return 1; // 校验通过
    } else {
        return 0; // 校验失败
    }
}

// 测试函数
int main() {

    SetConsoleOutputCP(CP_UTF8);

    // 测试用例1：有效数据（偶数个1）
    unsigned char test_msg1[] = {1, 0, 1, 0, 1, 0, 1, 0}; // 4个1，偶数
    int result1 = parity_check(test_msg1, 8);
    printf("测试1 (10101010): %s\n", result1 ? "通过" : "失败");

    // 测试用例2：无效数据（奇数个1）
    unsigned char test_msg2[] = {1, 0, 1, 0, 1, 0, 1, 1}; // 5个1，奇数
    int result2 = parity_check(test_msg2, 8);
    printf("测试2 (10101011): %s\n", result2 ? "通过" : "失败");

    // 测试用例3：全0
    unsigned char test_msg3[] = {0, 0, 0, 0, 0, 0, 0, 0}; // 0个1，偶数
    int result3 = parity_check(test_msg3, 8);
    printf("测试3 (00000000): %s\n", result3 ? "通过" : "失败");

    // 测试用例4：全1
    unsigned char test_msg4[] = {1, 1, 1, 1, 1, 1, 1, 1}; // 8个1，偶数
    int result4 = parity_check(test_msg4, 8);
    printf("测试4 (11111111): %s\n", result4 ? "通过" : "失败");

    return 0;
}